/**
 * 表单字段转换工具
 * 用于处理表单字段值格式转换，特别是 CheckboxGroup 等组件的数组值转换
 */

/**
 * 转换 CheckboxGroup 的数组值为单个值
 * @param value CheckboxGroup 的值（数组或其他类型）
 * @param targetValue 目标值，默认为 '1'
 * @param trueValue 转换后的真值，默认为 1
 * @param falseValue 转换后的假值，默认为 0
 * @returns 转换后的单个值
 */
export function transformCheckboxGroupValue(
  value: any,
  targetValue: string = '1',
  trueValue: any = 1,
  falseValue: any = 0,
): any {
  if (value === undefined || value === null) {
    return falseValue;
  }
  
  if (Array.isArray(value)) {
    return value.includes(targetValue) ? trueValue : falseValue;
  }
  
  return value ? trueValue : falseValue;
}

/**
 * 转换表单值中的特定字段
 * @param formValues 表单值对象
 * @param fieldTransforms 字段转换配置
 * @returns 转换后的表单值对象
 */
export function transformFormValues(
  formValues: Record<string, any>,
  fieldTransforms: Record<string, (value: any) => any>,
): Record<string, any> {
  const transformedValues = { ...formValues };
  
  Object.keys(fieldTransforms).forEach((fieldName) => {
    if (fieldName in transformedValues) {
      transformedValues[fieldName] = fieldTransforms[fieldName](transformedValues[fieldName]);
    }
  });
  
  return transformedValues;
}

/**
 * 创建 notIsZero 字段的转换函数
 * @returns notIsZero 字段的转换函数
 */
export function createNotIsZeroTransform() {
  return (value: any) => transformCheckboxGroupValue(value, '1', 1, 0);
}

/**
 * 通用的表单值获取和转换函数
 * @param getFieldsValue 获取表单值的函数
 * @param fieldTransforms 字段转换配置
 * @returns 转换后的表单值
 */
export function getTransformedFormValues(
  getFieldsValue: () => Record<string, any>,
  fieldTransforms: Record<string, (value: any) => any>,
): Record<string, any> {
  const formValues = getFieldsValue();
  return transformFormValues(formValues, fieldTransforms);
}

/**
 * 创建一个包装的表单实例，自动处理字段转换
 * @param originalForm 原始表单实例
 * @param fieldTransforms 字段转换配置
 * @returns 包装后的表单实例
 */
export function createTransformedFormWrapper(
  originalForm: any,
  fieldTransforms: Record<string, (value: any) => any>,
) {
  if (!originalForm) {
    throw new Error('originalForm 不能为空');
  }

  if (typeof originalForm.getFieldsValue !== 'function') {
    throw new Error('originalForm 必须包含 getFieldsValue 方法');
  }

  return {
    ...originalForm,
    getFieldsValue: () => {
      const formValues = originalForm.getFieldsValue();
      return transformFormValues(formValues, fieldTransforms);
    },
    // 保留原始的 getFieldsValue 方法
    getRawFieldsValue: originalForm.getFieldsValue,
  };
}

/**
 * 安全地创建包装的表单实例，如果原始表单为空则返回 null
 * @param originalForm 原始表单实例
 * @param fieldTransforms 字段转换配置
 * @returns 包装后的表单实例或 null
 */
export function createTransformedFormWrapperSafe(
  originalForm: any,
  fieldTransforms: Record<string, (value: any) => any>,
) {
  if (!originalForm || typeof originalForm.getFieldsValue !== 'function') {
    return null;
  }

  return createTransformedFormWrapper(originalForm, fieldTransforms);
}
